/**
 * 目的：为了保证方法和属性的安全。
 * public 默认，可在类、类的子类、类和子类的实例对象中访问
 * protected 仅能在类和子类中访问
 * private 仅能在类的内部访问
 * # es2022新特性 私有属性和方法 js中的私有属性
 * static 静态属性 访问时使用类名进行访问
 *        -在静态方法中可以使用this访问静态属性但是不建议这么使用
 *        -在静态方法中访问非静态变量也是不建议的
 *        -静态方法是直接挂载在类上，但是普通变量、函数是挂载在原型上的
 * override 表示这个是重写父类的函数
 * super. 可以调用父类中的方法和变量
 */
/**
 * ts特有的简写方式
 */
class A {
  info() {}
  // constructor(
  //   public name: string,
  //   protected color: string,
  //   private _age: number
  // ) {
  // } // 相当于 this.name = name; 不用声明变量和在函数体内进行赋值操作了
}
class B extends A {
  constructor() {
    super();
  }
  override info() {}
}

/**
 *
 * this 相关
 *
 * this在ts职工可以用作值，也可以用作类型
 * 1. 实现一个简化版的Set数据结构 下面的实例中，
 * (1) add(element: number): SimpleSet{} 中 add返回的this是父类的类型<SimpleSet>，没有办法访问到子类的show方法
 * (2) add(element: number): this{} 中 add返回的是实例对象的this,可以访问到子类的show方法
 */

class SimpleSet {
  private element: Map<number, boolean>;
  constructor() {
    this.element = new Map<number, boolean>();
  }
  // add(element: number): SimpleSet {
  //   // (method) SimpleSet.add(element: number): this
  //   this.element.set(element, true);
  //   return this;
  // } // add返回的this是父类的类型<SimpleSet>，没有办法访问到子类的show方法

  add(element: number): this {
    this.element.set(element, true);
    return this;
  }
  has(element: number): boolean {
    return this.element.has(element);
  }
  delete(element: number): boolean {
    return this.element.delete(element);
  }
  values(): number[] {
    return Array.from(this.element.keys());
  }
}

class SubSimpleSet extends SimpleSet {
  show() {
    console.log("niaho");
  }
}
const mySet = new SubSimpleSet();
mySet.add(1).add(2).add(3).show();
mySet.delete(2);
export {};
